package Dota2参议院;

import java.util.LinkedList;
import java.util.Queue;

/**
 * Dota2参议院
 * Dota2的世界里有两个阵营：Radiant（天辉）和 Dire（夜魇）
 * Dota2参议院由来自两派的参议员组成。现在参议院希望对一个Dota2游戏里的改变作为决定。他们以一个基于轮为过程的投票进行。
 * 在每一轮中，每一位参议员都可以行使两项权利中的一项：
 * 禁止一名参议员的权利：参议员可以让另一个参议员在这一轮中随后的几轮中丧失所有的权限。
 * 宣布胜利：如果参议员发现有权利投票的参议员都是同一个阵营的，他可以宣布胜利并决定在游戏中的有关变化。
 * <p>
 * 给定一个字符串代表每个参议员的阵营。字母R和D，分别代表了Radiant（天辉）和Dire（夜魇）。然后，如果有n个参议员，给定字符串的大小将是n。
 * 以轮为基础的过程从给定顺序的第一个参议员开始到最后一个参议员结束。这一过程将持续到投票结束。所有失去权利的参议员将在过程中被跳过。
 * <p>
 * 假设每一位参议员是足够聪明，会为自己的政党做出最好的策略，你需要预测哪一方最终会宣布胜利并在Dota2游戏中决定改变。输出应该是Radiant或Dire。
 */
public class Solution {
    public static void main(String[] args) {

        String res = bf("RDD");
        System.out.println("res = " + res);

        res = bf("RDRDD");
        System.out.println("res = " + res);
    }

    private static String bf(String senators) {

        Queue<Integer> rQueue = new LinkedList<>();
        Queue<Integer> dQueue = new LinkedList<>();

        for (int i = 0; i < senators.length(); i++) {
            if (senators.charAt(i) == 'R') {
                rQueue.offer(i);
            } else {
                dQueue.offer(i);
            }
        }

        while (!rQueue.isEmpty() && !dQueue.isEmpty()) {
            int r = rQueue.poll();
            int d = dQueue.poll();
            if (r < d) {
                rQueue.offer(r + senators.length());
            } else {
                dQueue.offer(d + senators.length());
            }
        }

        return rQueue.isEmpty() ? "D" : "R";
    }

}
